package cn.action;

import cn.base.BaseAction;
import cn.domain.Template;
import com.opensymphony.xwork2.ActionContext;
import javafx.application.Application;
import org.apache.struts2.ServletActionContext;
import org.jbpm.api.ProcessDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import sun.misc.BASE64Encoder;
import sun.misc.Request;

import javax.annotation.Resource;
import javax.mail.Session;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * Created by Administrator on 2017/4/24.
 */
@Controller
@Scope("prototype")
public class TemplateAction extends BaseAction<Template> {

    private File resource;     //用于文件上传

    private InputStream downLoad;     //用于文件下载

    private String fileName;    //下载文件名

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public InputStream getDownLoad() {
        return downLoad;
    }

    public void setDownLoad(InputStream downLoad) {
        this.downLoad = downLoad;
    }

    public File getResource() {
        return resource;
    }

    public void setResource(File resource) {
        this.resource = resource;
    }

    /**
     * 查询模板列表
     */
    public String list() {
        List<Template> list = templateService.findAll();
        getValueStack().set("list", list);
        return "list";
    }

    /**
     * 删除
     *
     * @return
     */
    public String delete() {
        templateService.delete(model.getId());
        return "toList";
    }

    /**
     * 跳转修改模板
     *
     * @return
     */
    public String editUI() {
        /**
         * 查询当前id对应的数据
         */
        Template template=templateService.getById(model.getId());
        getValueStack().push(template);

        List<ProcessDefinition> list=processService.findAll();
        getValueStack().set("process",list);
        return "editUI";
    }

    /**
     * 修改模板
     *
     * @return
     */
    public String edit() {
        //根据id获取数据
        Template template=templateService.getById(model.getId());
        String filePath1=template.getFilePath();
        String filePath2=upload(resource);
        //判断文件是否存在，进行删除文件
        File file=new File(filePath1);
        if(file.exists()){
            file.delete();
        }

        //给model设置FilePath属性
        model.setFilePath(filePath2);

        //修改数据
        templateService.update(model);
        return "toList";
    }

    /**
     * 跳转添加
     *
     * @return
     */
    public String addUI() {
        //准备数据---流程定义列表
        List<ProcessDefinition> processDefinitions = processService.findAll();
        getValueStack().set("process", processDefinitions);
        return "addUI";
    }

    /**
     * 添加+文件上传
     *
     * @return
     */
    public String add() {
        //设置路径
        model.setFilePath(upload(resource));
        templateService.save(model);
        return "toList";
    }

    /**
     * 下载模板对应的文件
     *
     * @return
     */
    public String downLoad() throws IOException {
        //根据id查询数据
        Template template=templateService.getById(model.getId());
        //查询需要下载的输入流
        downLoad=templateService.getInputStreamById(model.getId());
        //文件名
        fileName=template.getName()+".doc";
        String  agent=ServletActionContext.getRequest().getHeader("user-agent");
        fileName=encodeDownloadFilename(fileName,agent);
        return "downLoad";
    }
    /**
     * 下载文件时，针对不同浏览器，进行附件名的编码
     * @param filename 下载文件名
     * @param agent 客户端浏览器(通过request.getHeader("user-agent")获得)
     * @return 编码后的下载附件名
     * @throws IOException
     */
    public String encodeDownloadFilename(String filename, String agent) throws IOException {
        if(agent.contains("Firefox")){ // 火狐浏览器
            filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
        }else{ // IE及其他浏览器
            filename = URLEncoder.encode(filename,"utf-8");
        }
        return filename;
    }
    /**
     * 上传文件
     *
     * @return
     */
    public String upload(File file) {
        //获取项目在硬盘的路径
        String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/");
        //定义时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd");
        //获取当前时间
        String dateStr = sdf.format(new Date());

        dateStr = realPath + dateStr;
        //创建文件，目录为dateStr
        File dateFile = new File(dateStr);
        //判断文件是否存在
        if (!dateFile.exists()) {
            dateFile.mkdirs();
        }
        //生成文件名，UUID生成文件名
        String filePath = dateFile + UUID.randomUUID().toString() + ".doc";

        //创建一个FIle对象，路径为filrPath
        File dest = new File(filePath);

        //移动文件
        file.renameTo(dest);

        return filePath;
    }
}
